#pragma once
#include <algorithm>

using std::move;

template <class T> class range
{
	T min_val{};
	T max_val{};

public:
	constexpr range() = default;
	constexpr range(const T& begin, const T& end) :min_val{ begin }, max_val{ end }
	{if (max_val < min_val) {T tmp = max_val;  max_val = move(min_val); min_val = move(tmp);} }
	
	//������ ��� ��������� ������� �� ��������
	constexpr T Get_max()const { return max_val; } 
	constexpr T Get_min()const { return min_val; }
	
	//����� ��� �������� - �������� �� ��������� �������� � ��������
	constexpr bool in_range(T& val)const { return val >= min_val && val <= max_val; }
	
	//	�����, ������� �������� ����� �������� ������� ���� � ��������� �������������� ��������:
	//							���� ����������� ���������, �� ��� � ����������
	//							���� ������ ������������ ��������, ���������� �����������
	//							���� ������ ������������� ��������, ���������� ������������

	constexpr T in_range(const T& val)const { return (val >= min_val && val <= max_val)? val: (val < min_val)? min_val: max_val; }
	
};